library(data.table)
library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:data.table':

    between, first, last
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(tidyr)
library(ggpubr)
Loading required package: ggplot2
library(Biostrings)
Loading required package: BiocGenerics
Warning: package 'BiocGenerics' was built under R version 4.0.5
Loading required package: parallel

Attaching package: 'BiocGenerics'
The following objects are masked from 'package:parallel':

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,
    clusterExport, clusterMap, parApply, parCapply, parLapply,
    parLapplyLB, parRapply, parSapply, parSapplyLB
The following objects are masked from 'package:dplyr':

    combine, intersect, setdiff, union
The following objects are masked from 'package:stats':

    IQR, mad, sd, var, xtabs
The following objects are masked from 'package:base':

    Filter, Find, Map, Position, Reduce, anyDuplicated, append,
    as.data.frame, basename, cbind, colnames, dirname, do.call,
    duplicated, eval, evalq, get, grep, grepl, intersect, is.unsorted,
    lapply, mapply, match, mget, order, paste, pmax, pmax.int, pmin,
    pmin.int, rank, rbind, rownames, sapply, setdiff, sort, table,
    tapply, union, unique, unsplit, which.max, which.min
Loading required package: S4Vectors
Loading required package: stats4

Attaching package: 'S4Vectors'
The following object is masked from 'package:tidyr':

    expand
The following objects are masked from 'package:dplyr':

    first, rename
The following objects are masked from 'package:data.table':

    first, second
The following object is masked from 'package:base':

    expand.grid
Loading required package: IRanges

Attaching package: 'IRanges'
The following objects are masked from 'package:dplyr':

    collapse, desc, slice
The following object is masked from 'package:data.table':

    shift
Loading required package: XVector

Attaching package: 'Biostrings'
The following object is masked from 'package:base':

    strsplit
library(tidyverse)
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
✔ tibble  3.1.4     ✔ stringr 1.4.0
✔ readr   2.0.1     ✔ forcats 0.5.1
✔ purrr   0.3.4     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ BiocGenerics::Position() masks ggplot2::Position(), base::Position()
✖ dplyr::between()         masks data.table::between()
✖ Biostrings::collapse()   masks IRanges::collapse(), dplyr::collapse()
✖ BiocGenerics::combine()  masks dplyr::combine()
✖ purrr::compact()         masks XVector::compact()
✖ IRanges::desc()          masks dplyr::desc()
✖ S4Vectors::expand()      masks tidyr::expand()
✖ dplyr::filter()          masks stats::filter()
✖ S4Vectors::first()       masks dplyr::first(), data.table::first()
✖ dplyr::lag()             masks stats::lag()
✖ dplyr::last()            masks data.table::last()
✖ purrr::reduce()          masks IRanges::reduce()
✖ S4Vectors::rename()      masks dplyr::rename()
✖ XVector::slice()         masks IRanges::slice(), dplyr::slice()
✖ purrr::transpose()       masks data.table::transpose()
library(foreach)

Attaching package: 'foreach'
The following objects are masked from 'package:purrr':

    accumulate, when
library(stringdist)

Attaching package: 'stringdist'
The following object is masked from 'package:tidyr':

    extract
library(doParallel)
Loading required package: iterators
library(stringr)

Combine data to create ‘FULL MUTATIONS DT’

#OLD_BA2_WT_BINDING_SCORES =readRDS("BA2_WUHAN_PEPTIDES_BINDING_SCORES.rds")
#OLD_BA2_MT_BINDING_SCORES =readRDS("BA2_MT_PEPTIDES_BINDING_SCORES.rds")
#OLD_BA2_MUTATIONS = readRDS("Variant_Mutations/BA2_EPITOPE_MUTATIONS.rds")


BA2_WT_BINDING_SCORES = readRDS("OMICRON_SUBVARIANTS_ANALYSIS/BA2_WT_BINDING_SCORES_NETMHCPAN.rds")%>% mutate(Variant = "BA2")
BA2_MT_BINDING_SCORES = readRDS("OMICRON_SUBVARIANTS_ANALYSIS/BA2_MT_BINDING_SCORES_NETMHCPAN.rds")%>% mutate(Variant = "BA2")
BA2_MUTATIONS = readRDS("OMICRON_SUBVARIANTS_ANALYSIS/BA2_EPITOPE_MUTATIONS.rds")%>% mutate(Variant = "BA2")

BA5_WT_BINDING_SCORES = readRDS("OMICRON_SUBVARIANTS_ANALYSIS/BA5_WT_BINDING_SCORES_NETMHCPAN.rds")%>% mutate(Variant = "BA5")
BA5_MT_BINDING_SCORES = readRDS("OMICRON_SUBVARIANTS_ANALYSIS/BA5_MT_BINDING_SCORES_NETMHCPAN.rds")%>% mutate(Variant = "BA5")
BA5_MUTATIONS = readRDS("OMICRON_SUBVARIANTS_ANALYSIS/BA5_EPITOPE_MUTATIONS.rds") %>% mutate(Variant = "BA5")


BA4_WT_BINDING_SCORES = readRDS("OMICRON_SUBVARIANTS_ANALYSIS/BA4_WT_BINDING_SCORES_NETMHCPAN.rds")%>% mutate(Variant = "BA4")
BA4_MT_BINDING_SCORES = readRDS("OMICRON_SUBVARIANTS_ANALYSIS/BA4_MT_BINDING_SCORES_NETMHCPAN.rds")%>% mutate(Variant = "BA4")
BA4_MUTATIONS = readRDS("OMICRON_SUBVARIANTS_ANALYSIS/BA4_EPITOPE_MUTATIONS.rds") %>% mutate(Variant = "BA4")

BA275_WT_BINDING_SCORES = readRDS("OMICRON_SUBVARIANTS_ANALYSIS/BA275_WT_BINDING_SCORES_NETMHCPAN.rds")%>% mutate(Variant = "BA2_75")
BA275_MT_BINDING_SCORES = readRDS("OMICRON_SUBVARIANTS_ANALYSIS/BA275_MT_BINDING_SCORES_NETMHCPAN.rds")%>% mutate(Variant = "BA2_75")
BA275_MUTATIONS = readRDS("OMICRON_SUBVARIANTS_ANALYSIS/BA275_EPITOPE_MUTATIONS.rds") %>% mutate(Variant = "BA2_75")

FULL_MUTATIONS_DT_BA275 = BA275_MUTATIONS %>% inner_join(BA275_WT_BINDING_SCORES) %>% inner_join(BA275_MT_BINDING_SCORES)
Joining, by = c("Peptide", "Variant")
Joining, by = c("VariantAlignment", "Variant")
FULL_MUTATIONS_DT_BA4 = BA4_MUTATIONS %>% inner_join(BA4_WT_BINDING_SCORES) %>% inner_join(BA4_MT_BINDING_SCORES)
Joining, by = c("Peptide", "Variant")
Joining, by = c("VariantAlignment", "Variant")
#FULL_MUTATIONS_DT_OLD_BA2=OLD_BA2_MUTATIONS %>% inner_join(OLD_BA2_WT_BINDING_SCORES) %>% inner_join(OLD_BA2_MT_BINDING_SCORES)

FULL_MUTATIONS_DT_BA2=BA2_MUTATIONS %>% inner_join(BA2_WT_BINDING_SCORES) %>% inner_join(BA2_MT_BINDING_SCORES)
Joining, by = c("Peptide", "Variant")
Joining, by = c("VariantAlignment", "Variant")
FULL_MUTATIONS_DT_BA5=BA5_MUTATIONS %>% inner_join(BA5_WT_BINDING_SCORES) %>% inner_join(BA5_MT_BINDING_SCORES)
Joining, by = c("Peptide", "Variant")
Joining, by = c("VariantAlignment", "Variant")
FULL_MUTATIONS_DT = rbind(FULL_MUTATIONS_DT_BA2, FULL_MUTATIONS_DT_BA5, FULL_MUTATIONS_DT_BA4)
FULL_MUTATIONS_DT=FULL_MUTATIONS_DT%>% ungroup()
saveRDS(FULL_MUTATIONS_DT,"SUBVARIANTS_FULL_MUTATIONS_DT.rds")
## MUTATIONS_DT_SUBVAR
SUBVAR_MUTATIONS=BA2_MUTATIONS %>% rbind(BA4_MUTATIONS)%>% rbind(BA5_MUTATIONS)#%>% rbind(BA275_MUTATIONS)

MUTATION_LIST= fread("SUBVARIANT_SNPS.csv")
MUTATION_LIST=MUTATION_LIST %>% mutate(MutationPos = parse_number(Mutation))

SUBVAR_MUTATIONS=SUBVAR_MUTATIONS %>% separate_rows_(cols = "MutationPos",sep=",")%>% mutate(MutationPos =as.numeric(MutationPos)) %>% left_join(MUTATION_LIST)
Joining, by = c("MutationPos", "Protein", "Variant")
SUBVAR_MUTATIONS=SUBVAR_MUTATIONS %>% group_by(Peptide, VariantAlignment,start_pos,Protein,Variant)%>%
  dplyr::summarise(MutationPos=paste0(MutationPos,collapse = ","),
                   Mutation = paste0(Mutation, collapse = ","))%>% ungroup
`summarise()` has grouped output by 'Peptide', 'VariantAlignment', 'start_pos', 'Protein'. You can override using the `.groups` argument.
SUBVAR_MUTATIONS=SUBVAR_MUTATIONS %>% mutate(Hamming = stringdist::stringdist(Peptide,VariantAlignment,method="hamming"))

#saveRDS(SUBVAR_MUTATIONS,"OMICRON_EPITOPE_MUTATIONS_SUBVAR.rds")

Compare old vs . new BA2

AGRETOPICITY_DT_BA2=FULL_MUTATIONS_DT_BA2 %>% ungroup%>% select(Peptide, VariantAlignment, Protein, Predicted_Binding, nM_41, MT_nM_41,Binder,MT_Binder) %>%
        separate_rows_(cols = c("Predicted_Binding","nM_41","MT_nM_41","Binder","MT_Binder"),sep=",") %>% mutate(nM_41 = as.numeric(nM_41)) %>% mutate(MT_nM_41 = as.numeric(MT_nM_41))%>% mutate(Agretopicity = MT_nM_41/nM_41)

#AGRETOPICITY_DT_OLD_BA2=FULL_MUTATIONS_DT_OLD_BA2%>% ungroup %>% select(Peptide, VariantAlignment, Protein, Predicted_Binding, nM_41, MT_nM_41,Binder,MT_Binder) %>%
 #       separate_rows_(cols = c("Predicted_Binding","nM_41","MT_nM_41","Binder","MT_Binder"),sep=",") %>% mutate(nM_41 = as.numeric(nM_41)) %>% mutate(MT_nM_41 = as.numeric(MT_nM_41))%>% mutate(Agretopicity = MT_nM_41/nM_41)

AGRETOPICITY_DT_BA2 %>% nrow
[1] 4480
#AGRETOPICITY_DT_OLD_BA2 %>% nrow

#setdiff(AGRETOPICITY_DT_BA2, AGRETOPICITY_DT_OLD_BA2)

Create Agretopicity DT

AGRETOPICITY_DT=FULL_MUTATIONS_DT %>% select(Peptide, VariantAlignment, Protein, Predicted_Binding, nM_41, MT_nM_41,Binder,MT_Binder, Variant) %>%
        separate_rows_(cols = c("Predicted_Binding","nM_41","MT_nM_41","Binder","MT_Binder"),sep=",") %>% mutate(nM_41 = as.numeric(nM_41)) %>% mutate(MT_nM_41 = as.numeric(MT_nM_41))
AGRETOPICITY_DT %>% head
AGRETOPICITY_DT=AGRETOPICITY_DT %>% mutate(Agretopicity = MT_nM_41/nM_41)

SPIKE_AGRETOPICITY=AGRETOPICITY_DT %>% filter(Protein == 'surface glycoprotein') %>% mutate(Length = nchar(Peptide))

SPIKE_AGRETOPICITY %>% group_by(Variant)%>% dplyr::summarise(meanAg = mean(Agretopicity))
saveRDS(AGRETOPICITY_DT,"SUBVARIANTS_AGRETOPICITY_DT.rds")
SPIKE_AGRETOPICITY=SPIKE_AGRETOPICITY %>% filter(! (Binder == "NONBINDER" & MT_Binder == "NONBINDER"))%>% ungroup
SPIKE_AGRETOPICITY %>% select(Peptide,VariantAlignment) %>% distinct() %>% nrow
[1] 57
SPIKE_AGRETOPICITY %>% group_by(Variant,Peptide) %>% dplyr::summarise(n=n())
`summarise()` has grouped output by 'Variant'. You can override using the `.groups` argument.
SPIKE_AGRETOPICITY %>% nrow
[1] 1200
SPIKE_AGRETOPICITY %>% group_by(Variant)%>% dplyr::summarise(meanAg = mean(Agretopicity))
SPIKE_AGRETOPICITY %>% select(Peptide, nM_41, MT_nM_41, Variant)%>% pivot_longer(cols = c(nM_41,MT_nM_41), names_to = "Dataset",values_to = "Aff")%>%
  mutate(Dataset = factor(Dataset, levels = c("nM_41","MT_nM_41")))%>%
        ggplot(aes(x=Aff, color=Dataset))+stat_ecdf(size=1)+facet_grid(~Variant)+theme_pubr(base_size = 16)+grids()+ guides(color = guide_legend(nrow = 2))+ylab("Cumulative Freq. of Peptides")+xlab("Binding Affinity\n(nM)")+geom_vline(xintercept = 500,linetype="dashed",alpha=0.5)

SUBVAR_ECDF_PLT=SPIKE_AGRETOPICITY %>% select(Peptide, nM_41, MT_nM_41, Variant)%>% pivot_longer(cols = c(nM_41,MT_nM_41), names_to = "Dataset",values_to = "Aff")%>%
  mutate(Dataset = replace(Dataset, Dataset == "nM_41", "Wuhan"))%>%mutate(Dataset = replace(Dataset, Dataset == "MT_nM_41", "Omicron"))%>%
  mutate(Dataset = factor(Dataset, levels = c("Wuhan","Omicron")))%>%
        ggplot(aes(x=Aff, color=Dataset))+stat_ecdf(size=1)+facet_grid(~Variant)+theme_pubr(base_size = 16)+grids()+ guides(color = guide_legend(nrow = 2))+ylab("Cumulative Freq. of Peptides")+xlab("Log10 Binding Affinity\n(nM)")+geom_vline(xintercept = 500,linetype="dashed",alpha=0.5)+scale_x_log10()
SUBVAR_ECDF_PLT

saveRDS(SUBVAR_ECDF_PLT, "SUBVAR_ECDF_PLT.rds")

SUBVAR_VIOLIN_PLT=SPIKE_AGRETOPICITY %>% select(Peptide, nM_41, MT_nM_41, Variant)%>% pivot_longer(cols = c(nM_41,MT_nM_41), names_to = "Dataset",values_to = "Aff") %>%
  mutate(Dataset = replace(Dataset, Dataset == "nM_41", "Wuhan"))%>%mutate(Dataset = replace(Dataset, Dataset == "MT_nM_41", "Omicron"))%>%
  mutate(Dataset = factor(Dataset, levels = c("Wuhan","Omicron")))%>%
         ggviolin(x="Dataset",y="Aff",color = "Dataset",add="boxplot",trim=TRUE)+facet_grid(~Variant)+theme_pubr(base_size = 16)+scale_y_log10()+stat_compare_means()+ylab("Binding Affinity\n(nM)")
SUBVAR_VIOLIN_PLT

SUBVAR_VIOLIN_PLT=SPIKE_AGRETOPICITY %>% select(Peptide, nM_41, MT_nM_41, Variant)%>% pivot_longer(cols = c(nM_41,MT_nM_41), names_to = "Dataset",values_to = "Aff") %>%
  mutate(Dataset = replace(Dataset, Dataset == "nM_41", "Wuhan"))%>%mutate(Dataset = replace(Dataset, Dataset == "MT_nM_41", "Omicron"))%>%
  mutate(Dataset = factor(Dataset, levels = c("Wuhan","Omicron")))%>%
         ggviolin(x="Dataset",y="Aff",color = "Dataset",add="boxplot",trim=TRUE)+facet_grid(~Variant)+theme_pubr(base_size = 16)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center")+ylab("Binding Affinity\n(nM)")
SUBVAR_VIOLIN_PLT

saveRDS(SUBVAR_VIOLIN_PLT, "SUBVAR_VIOLIN_PLT.rds")
AB_SUPERTYPES=fread("HLA_AB_SUPERTYPES.csv") %>% mutate(Allele = gsub("\\*","",Allele))%>% mutate(Allele = paste0("HLA-",Allele))%>% dplyr::rename(HLA_Allele = Allele)

DATA_FOR_ANALYSIS=FULL_MUTATIONS_DT%>% ungroup() %>% filter(Protein == "surface glycoprotein") %>% select(Peptide, VariantAlignment, Predicted_Binding, nM_41, MT_nM_41, Binder,MT_Binder,Variant) %>% separate_rows_(cols = c("Predicted_Binding","nM_41","MT_nM_41","Binder","MT_Binder"),sep=",")%>% mutate(nM_41 = as.numeric(nM_41), MT_nM_41=as.numeric(MT_nM_41))%>% mutate(Agretopicity = MT_nM_41/nM_41)

HLA_A_B_AGRETOPICITY=DATA_FOR_ANALYSIS %>% dplyr::rename(HLA_Allele=Predicted_Binding)%>% filter(HLA_Allele %in% grep("HLA-A|HLA-B",HLA_Allele,value = T)) %>% inner_join(AB_SUPERTYPES) %>%
filter(! (Binder == "NONBINDER" & MT_Binder == 'NONBINDER'))
Joining, by = "HLA_Allele"
HLA_CDATASET_AGRETOPICITY=DATA_FOR_ANALYSIS %>% dplyr::rename(HLA_Allele=Predicted_Binding)%>% filter(!HLA_Allele %in% grep("HLA-A|HLA-B",HLA_Allele,value = T))%>% mutate(Supertype = str_extract(HLA_Allele,"HLA-C[0-9][0-9]"))%>%
        mutate(Supertype = gsub("HLA\\-","",Supertype))%>%
filter(! (Binder == "NONBINDER" & MT_Binder == 'NONBINDER'))
VARIANT = "BA2"
HLA_A_B_AGRETOPICITY %>% rbind(HLA_CDATASET_AGRETOPICITY)%>% filter(Variant == VARIANT) %>%
        ggpaired(cond1 = "nM_41", cond2 = "MT_nM_41",line.color = "gray")+facet_wrap(~Supertype,ncol=9)+theme_pubr(base_size = 16)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center")+rotate_x_text(angle=45)+ylab("Log10 Binding Affinity (nM)")+ggtitle(VARIANT)

VARIANT = "BA4"
HLA_A_B_AGRETOPICITY %>% rbind(HLA_CDATASET_AGRETOPICITY)%>% filter(Variant == VARIANT) %>%
        ggpaired(cond1 = "nM_41", cond2 = "MT_nM_41",line.color = "gray")+facet_wrap(~Supertype,ncol=9)+theme_pubr(base_size = 16)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center")+rotate_x_text(angle=45)+ylab("Log10 Binding Affinity (nM)")+ggtitle(VARIANT)

VARIANT = "BA5"
HLA_A_B_AGRETOPICITY %>% rbind(HLA_CDATASET_AGRETOPICITY)%>% filter(Variant == VARIANT) %>%
        ggpaired(cond1 = "nM_41", cond2 = "MT_nM_41",line.color = "gray")+facet_wrap(~Supertype,ncol=9)+theme_pubr(base_size = 16)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center")+rotate_x_text(angle=45)+ylab("Log10 Binding Affinity (nM)")+ggtitle(VARIANT)

#VARIANT = "BA2_75"
#HLA_A_B_AGRETOPICITY %>% rbind(HLA_CDATASET_AGRETOPICITY)%>% filter(Variant == VARIANT) %>%
 #       ggpaired(cond1 = "nM_41", cond2 = "MT_nM_41",line.color = "gray")+facet_wrap(~Supertype,ncol=9)+theme_pubr(base_size = 16)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = #"center")+rotate_x_text(angle=45)+ylab("Log10 Binding Affinity (nM)")+ggtitle(VARIANT)


HLA_A_B_AGRETOPICITY %>% rbind(HLA_CDATASET_AGRETOPICITY)%>% select(!Variant)%>% distinct()%>%
        ggpaired(cond1 = "nM_41", cond2 = "MT_nM_41",line.color = "gray")+facet_wrap(~Supertype,ncol=9)+theme_pubr(base_size = 16)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center")+rotate_x_text(angle=45)+ylab("Log10 Binding Affinity (nM)")+ggtitle("ALL")

SUBVAR_SUPERTYPE_BOXPLT=HLA_A_B_AGRETOPICITY %>% rbind(HLA_CDATASET_AGRETOPICITY)%>% filter(Supertype %in% c("A02","A03","B07","C01"))%>%
        dplyr::rename(Wuhan=nM_41, Omicron = MT_nM_41)%>%
        ggpaired(cond1 = "Wuhan", cond2 = "Omicron",line.color = "gray")+facet_wrap(Variant~Supertype)+theme_pubr(base_size = 16)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center")+rotate_x_text(angle=45)+ylab("Log10 Binding Affinity (nM)")

SUBVAR_SUPERTYPE_BOXPLT

saveRDS(SUBVAR_SUPERTYPE_BOXPLT,file="SUBVAR_SUPERTYPE_BOXPLT.rds")

All protein

AB_SUPERTYPES=fread("HLA_AB_SUPERTYPES.csv") %>% mutate(Allele = gsub("\\*","",Allele))%>% mutate(Allele = paste0("HLA-",Allele))%>% dplyr::rename(HLA_Allele = Allele)

DATA_FOR_ANALYSIS=FULL_MUTATIONS_DT%>% ungroup()  %>% select(Peptide, VariantAlignment, Predicted_Binding, nM_41, MT_nM_41, Binder,MT_Binder,Variant) %>% separate_rows_(cols = c("Predicted_Binding","nM_41","MT_nM_41","Binder","MT_Binder"),sep=",")%>% mutate(nM_41 = as.numeric(nM_41), MT_nM_41=as.numeric(MT_nM_41))%>% mutate(Agretopicity = MT_nM_41/nM_41)

HLA_A_B_AGRETOPICITY=DATA_FOR_ANALYSIS %>% dplyr::rename(HLA_Allele=Predicted_Binding)%>% filter(HLA_Allele %in% grep("HLA-A|HLA-B",HLA_Allele,value = T)) %>% inner_join(AB_SUPERTYPES) %>%
filter(! (Binder == "NONBINDER" & MT_Binder == 'NONBINDER'))
Joining, by = "HLA_Allele"
HLA_CDATASET_AGRETOPICITY=DATA_FOR_ANALYSIS %>% dplyr::rename(HLA_Allele=Predicted_Binding)%>% filter(!HLA_Allele %in% grep("HLA-A|HLA-B",HLA_Allele,value = T))%>% mutate(Supertype = str_extract(HLA_Allele,"HLA-C[0-9][0-9]"))%>%
        mutate(Supertype = gsub("HLA\\-","",Supertype))%>%
filter(! (Binder == "NONBINDER" & MT_Binder == 'NONBINDER'))
VARIANT = "BA2"
HLA_A_B_AGRETOPICITY %>% rbind(HLA_CDATASET_AGRETOPICITY)%>% filter(Variant == VARIANT) %>%
        ggpaired(cond1 = "nM_41", cond2 = "MT_nM_41",line.color = "gray")+facet_wrap(~Supertype,ncol=9)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center",paired = TRUE)+rotate_x_text(angle=45)+ylab("Log10 Binding Affinity (nM)")+ggtitle(VARIANT)

VARIANT = "BA4"
HLA_A_B_AGRETOPICITY %>% rbind(HLA_CDATASET_AGRETOPICITY)%>% filter(Variant == VARIANT) %>%
        ggpaired(cond1 = "nM_41", cond2 = "MT_nM_41",line.color = "gray")+facet_wrap(~Supertype,ncol=9)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center",paired = TRUE)+rotate_x_text(angle=45)+ylab("Log10 Binding Affinity (nM)")+ggtitle(VARIANT)

VARIANT = "BA5"
HLA_A_B_AGRETOPICITY %>% rbind(HLA_CDATASET_AGRETOPICITY)%>% filter(Variant == VARIANT) %>%
        ggpaired(cond1 = "nM_41", cond2 = "MT_nM_41",line.color = "gray")+facet_wrap(~Supertype,ncol=9)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center",paired = TRUE)+rotate_x_text(angle=45)+ylab("Log10 Binding Affinity (nM)")+ggtitle(VARIANT)

#VARIANT = "BA2_75"
#HLA_A_B_AGRETOPICITY %>% rbind(HLA_CDATASET_AGRETOPICITY)%>% filter(Variant == VARIANT) %>%
 #       ggpaired(cond1 = "nM_41", cond2 = "MT_nM_41",line.color = "gray")+facet_wrap(~Supertype,ncol=9)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center",paired = TRUE)+#rotate_x_text(angle=45)+ylab("Log10 Binding Affinity (nM)")+ggtitle(VARIANT)

HLA_A_B_AGRETOPICITY %>% rbind(HLA_CDATASET_AGRETOPICITY)%>% select(!Variant)%>% distinct()%>%
        ggpaired(cond1 = "nM_41", cond2 = "MT_nM_41",line.color = "gray")+facet_wrap(~Supertype,ncol=9)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center",paired = TRUE)+rotate_x_text(angle=45)+ylab("Log10 Binding Affinity (nM)")+ggtitle("ALL")

Supplementary

AGRETOPICITY_DT=FULL_MUTATIONS_DT %>% select(Peptide, VariantAlignment, Protein, Predicted_Binding, BA_Rank,MT_BA_Rank,Binder,MT_Binder, Variant) %>%
        separate_rows_(cols = c("Predicted_Binding","BA_Rank","MT_BA_Rank","Binder","MT_Binder"),sep=",") %>% mutate(BA_Rank = as.numeric(BA_Rank)) %>% mutate(MT_BA_Rank = as.numeric(MT_BA_Rank))
AGRETOPICITY_DT %>% head
SPIKE_AGRETOPICITY=AGRETOPICITY_DT %>% filter(Protein == 'surface glycoprotein') %>% mutate(Length = nchar(Peptide))


saveRDS(AGRETOPICITY_DT,"SUBVARIANTS_AGRETOPICITY_DT.rds")
SPIKE_AGRETOPICITY %>% select(Peptide,VariantAlignment) %>% distinct() %>% nrow
[1] 58
SPIKE_AGRETOPICITY %>% group_by(Variant,Peptide) %>% dplyr::summarise(n=n())
`summarise()` has grouped output by 'Variant'. You can override using the `.groups` argument.
SPIKE_AGRETOPICITY %>% nrow
[1] 9792
SPIKE_AGRETOPICITY=SPIKE_AGRETOPICITY %>% filter(! (Binder == "NONBINDER" & MT_Binder == "NONBINDER"))%>% ungroup

SPIKE_AGRETOPICITY %>% select(Peptide, BA_Rank, MT_BA_Rank, Variant)%>% pivot_longer(cols = c(BA_Rank,MT_BA_Rank), names_to = "Dataset",values_to = "Aff")%>%
  mutate(Dataset = factor(Dataset, levels = c("BA_Rank","MT_BA_Rank")))%>%
        ggplot(aes(x=Aff, color=Dataset))+stat_ecdf(size=1)+facet_grid(~Variant)+theme_pubr(base_size = 16)+grids()+ guides(color = guide_legend(nrow = 2))+ylab("Cumulative Freq. of Peptides")+xlab("Binding Affinity\n(nM)")+geom_vline(xintercept = 2,linetype="dashed",alpha=0.5)

SUBVAR_ECDF_PLT=SPIKE_AGRETOPICITY %>% select(Peptide, BA_Rank, MT_BA_Rank, Variant)%>% pivot_longer(cols = c(BA_Rank,MT_BA_Rank), names_to = "Dataset",values_to = "Aff")%>%
  mutate(Dataset = replace(Dataset, Dataset == "BA_Rank", "Wuhan"))%>%mutate(Dataset = replace(Dataset, Dataset == "MT_BA_Rank", "Omicron"))%>%
  mutate(Dataset = factor(Dataset, levels = c("Wuhan","Omicron")))%>%
        ggplot(aes(x=Aff, color=Dataset))+stat_ecdf(size=1)+facet_grid(~Variant)+theme_pubr(base_size = 16)+grids()+ guides(color = guide_legend(nrow = 2))+ylab("Cumulative Freq. of Peptides")+xlab("Log10 Binding Affinity\n(nM)")+geom_vline(xintercept = 2,linetype="dashed",alpha=0.5)+scale_x_log10()
SUBVAR_ECDF_PLT

saveRDS(SUBVAR_ECDF_PLT, "SUBVAR_RANK_ECDF_PLT.rds")

SUBVAR_VIOLIN_PLT=SPIKE_AGRETOPICITY %>% select(Peptide, BA_Rank, MT_BA_Rank, Variant)%>% pivot_longer(cols = c(BA_Rank,MT_BA_Rank), names_to = "Dataset",values_to = "Aff") %>%
  mutate(Dataset = replace(Dataset, Dataset == "BA_Rank", "Wuhan"))%>%mutate(Dataset = replace(Dataset, Dataset == "MT_BA_Rank", "Omicron"))%>%
  mutate(Dataset = factor(Dataset, levels = c("Wuhan","Omicron")))%>%
         ggviolin(x="Dataset",y="Aff",color = "Dataset",add="boxplot",trim=TRUE)+facet_grid(~Variant)+theme_pubr(base_size = 16)+scale_y_log10()+stat_compare_means()+ylab("Binding Affinity\n(Rank)")
SUBVAR_VIOLIN_PLT

SUBVAR_VIOLIN_PLT=SPIKE_AGRETOPICITY %>% select(Peptide, BA_Rank, MT_BA_Rank, Variant)%>% pivot_longer(cols = c(BA_Rank,MT_BA_Rank), names_to = "Dataset",values_to = "Aff") %>%
  mutate(Dataset = replace(Dataset, Dataset == "BA_Rank", "Wuhan"))%>%mutate(Dataset = replace(Dataset, Dataset == "MT_BA_Rank", "Omicron"))%>%
  mutate(Dataset = factor(Dataset, levels = c("Wuhan","Omicron")))%>%
         ggviolin(x="Dataset",y="Aff",color = "Dataset",add="boxplot",trim=TRUE)+facet_grid(~Variant)+theme_pubr(base_size = 16)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center")+ylab("Binding Affinity\n(Rank)")
SUBVAR_VIOLIN_PLT

saveRDS(SUBVAR_VIOLIN_PLT, "SUBVAR_RANK_VIOLIN_PLT.rds")
AGRETOPICITY_DT=AGRETOPICITY_DT %>% filter(! (Binder == "NONBINDER" & MT_Binder == "NONBINDER"))%>% ungroup

AGRETOPICITY_DT %>% select(Peptide, BA_Rank, MT_BA_Rank, Variant)%>% pivot_longer(cols = c(BA_Rank,MT_BA_Rank), names_to = "Dataset",values_to = "Aff")%>%
  mutate(Dataset = factor(Dataset, levels = c("BA_Rank","MT_BA_Rank")))%>%
        ggplot(aes(x=Aff, color=Dataset))+stat_ecdf(size=1)+facet_grid(~Variant)+theme_pubr(base_size = 16)+grids()+ guides(color = guide_legend(nrow = 2))+ylab("Cumulative Freq. of Peptides")+xlab("Binding Affinity\n(Rank)")+geom_vline(xintercept = 2,linetype="dashed",alpha=0.5)

SUBVAR_ECDF_PLT=AGRETOPICITY_DT %>% select(Peptide, BA_Rank, MT_BA_Rank, Variant)%>% pivot_longer(cols = c(BA_Rank,MT_BA_Rank), names_to = "Dataset",values_to = "Aff")%>%
  mutate(Dataset = replace(Dataset, Dataset == "BA_Rank", "Wuhan"))%>%mutate(Dataset = replace(Dataset, Dataset == "MT_BA_Rank", "Omicron"))%>%
  mutate(Dataset = factor(Dataset, levels = c("Wuhan","Omicron")))%>%
        ggplot(aes(x=Aff, color=Dataset))+stat_ecdf(size=1)+facet_grid(~Variant)+theme_pubr(base_size = 16)+grids()+ guides(color = guide_legend(nrow = 2))+ylab("Cumulative Freq. of Peptides")+xlab("Log10 Binding Affinity\n(Rank)")+geom_vline(xintercept = 2,linetype="dashed",alpha=0.5)+scale_x_log10()
SUBVAR_ECDF_PLT

saveRDS(SUBVAR_ECDF_PLT, "SUBVAR_RANK_ALL_ECDF_PLT.rds")

SUBVAR_VIOLIN_PLT=AGRETOPICITY_DT %>% select(Peptide, BA_Rank, MT_BA_Rank, Variant)%>% pivot_longer(cols = c(BA_Rank,MT_BA_Rank), names_to = "Dataset",values_to = "Aff") %>%
  mutate(Dataset = replace(Dataset, Dataset == "BA_Rank", "Wuhan"))%>%mutate(Dataset = replace(Dataset, Dataset == "MT_BA_Rank", "Omicron"))%>%
  mutate(Dataset = factor(Dataset, levels = c("Wuhan","Omicron")))%>%
         ggviolin(x="Dataset",y="Aff",color = "Dataset",add="boxplot",trim=TRUE)+facet_grid(~Variant)+theme_pubr(base_size = 16)+scale_y_log10()+stat_compare_means()+ylab("Binding Affinity\n(Rank)")
SUBVAR_VIOLIN_PLT

SUBVAR_VIOLIN_PLT=AGRETOPICITY_DT %>% select(Peptide, BA_Rank, MT_BA_Rank, Variant)%>% pivot_longer(cols = c(BA_Rank,MT_BA_Rank), names_to = "Dataset",values_to = "Aff") %>%
  mutate(Dataset = replace(Dataset, Dataset == "BA_Rank", "Wuhan"))%>%mutate(Dataset = replace(Dataset, Dataset == "MT_BA_Rank", "Omicron"))%>%
  mutate(Dataset = factor(Dataset, levels = c("Wuhan","Omicron")))%>%
         ggviolin(x="Dataset",y="Aff",color = "Dataset",add="boxplot",trim=TRUE)+facet_grid(~Variant)+theme_pubr(base_size = 16)+scale_y_log10()+stat_compare_means(label = "p.signif",label.x.npc = "center")+ylab("Binding Affinity\n(Rank)")
SUBVAR_VIOLIN_PLT

saveRDS(SUBVAR_VIOLIN_PLT, "SUBVAR_RANK_ALL_VIOLIN_PLT.rds")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkoQmlvc3RyaW5ncykKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZm9yZWFjaCkKbGlicmFyeShzdHJpbmdkaXN0KQpsaWJyYXJ5KGRvUGFyYWxsZWwpCmxpYnJhcnkoc3RyaW5ncikKCmBgYAoKIyBDb21iaW5lIGRhdGEgdG8gY3JlYXRlICdGVUxMIE1VVEFUSU9OUyBEVCcKCmBgYHtyfQoKI09MRF9CQTJfV1RfQklORElOR19TQ09SRVMgPXJlYWRSRFMoIkJBMl9XVUhBTl9QRVBUSURFU19CSU5ESU5HX1NDT1JFUy5yZHMiKQojT0xEX0JBMl9NVF9CSU5ESU5HX1NDT1JFUyA9cmVhZFJEUygiQkEyX01UX1BFUFRJREVTX0JJTkRJTkdfU0NPUkVTLnJkcyIpCiNPTERfQkEyX01VVEFUSU9OUyA9IHJlYWRSRFMoIlZhcmlhbnRfTXV0YXRpb25zL0JBMl9FUElUT1BFX01VVEFUSU9OUy5yZHMiKQoKCkJBMl9XVF9CSU5ESU5HX1NDT1JFUyA9IHJlYWRSRFMoIk9NSUNST05fU1VCVkFSSUFOVFNfQU5BTFlTSVMvQkEyX1dUX0JJTkRJTkdfU0NPUkVTX05FVE1IQ1BBTi5yZHMiKSU+JSBtdXRhdGUoVmFyaWFudCA9ICJCQTIiKQpCQTJfTVRfQklORElOR19TQ09SRVMgPSByZWFkUkRTKCJPTUlDUk9OX1NVQlZBUklBTlRTX0FOQUxZU0lTL0JBMl9NVF9CSU5ESU5HX1NDT1JFU19ORVRNSENQQU4ucmRzIiklPiUgbXV0YXRlKFZhcmlhbnQgPSAiQkEyIikKQkEyX01VVEFUSU9OUyA9IHJlYWRSRFMoIk9NSUNST05fU1VCVkFSSUFOVFNfQU5BTFlTSVMvQkEyX0VQSVRPUEVfTVVUQVRJT05TLnJkcyIpJT4lIG11dGF0ZShWYXJpYW50ID0gIkJBMiIpCgpCQTVfV1RfQklORElOR19TQ09SRVMgPSByZWFkUkRTKCJPTUlDUk9OX1NVQlZBUklBTlRTX0FOQUxZU0lTL0JBNV9XVF9CSU5ESU5HX1NDT1JFU19ORVRNSENQQU4ucmRzIiklPiUgbXV0YXRlKFZhcmlhbnQgPSAiQkE1IikKQkE1X01UX0JJTkRJTkdfU0NPUkVTID0gcmVhZFJEUygiT01JQ1JPTl9TVUJWQVJJQU5UU19BTkFMWVNJUy9CQTVfTVRfQklORElOR19TQ09SRVNfTkVUTUhDUEFOLnJkcyIpJT4lIG11dGF0ZShWYXJpYW50ID0gIkJBNSIpCkJBNV9NVVRBVElPTlMgPSByZWFkUkRTKCJPTUlDUk9OX1NVQlZBUklBTlRTX0FOQUxZU0lTL0JBNV9FUElUT1BFX01VVEFUSU9OUy5yZHMiKSAlPiUgbXV0YXRlKFZhcmlhbnQgPSAiQkE1IikKCgpCQTRfV1RfQklORElOR19TQ09SRVMgPSByZWFkUkRTKCJPTUlDUk9OX1NVQlZBUklBTlRTX0FOQUxZU0lTL0JBNF9XVF9CSU5ESU5HX1NDT1JFU19ORVRNSENQQU4ucmRzIiklPiUgbXV0YXRlKFZhcmlhbnQgPSAiQkE0IikKQkE0X01UX0JJTkRJTkdfU0NPUkVTID0gcmVhZFJEUygiT01JQ1JPTl9TVUJWQVJJQU5UU19BTkFMWVNJUy9CQTRfTVRfQklORElOR19TQ09SRVNfTkVUTUhDUEFOLnJkcyIpJT4lIG11dGF0ZShWYXJpYW50ID0gIkJBNCIpCkJBNF9NVVRBVElPTlMgPSByZWFkUkRTKCJPTUlDUk9OX1NVQlZBUklBTlRTX0FOQUxZU0lTL0JBNF9FUElUT1BFX01VVEFUSU9OUy5yZHMiKSAlPiUgbXV0YXRlKFZhcmlhbnQgPSAiQkE0IikKCkJBMjc1X1dUX0JJTkRJTkdfU0NPUkVTID0gcmVhZFJEUygiT01JQ1JPTl9TVUJWQVJJQU5UU19BTkFMWVNJUy9CQTI3NV9XVF9CSU5ESU5HX1NDT1JFU19ORVRNSENQQU4ucmRzIiklPiUgbXV0YXRlKFZhcmlhbnQgPSAiQkEyXzc1IikKQkEyNzVfTVRfQklORElOR19TQ09SRVMgPSByZWFkUkRTKCJPTUlDUk9OX1NVQlZBUklBTlRTX0FOQUxZU0lTL0JBMjc1X01UX0JJTkRJTkdfU0NPUkVTX05FVE1IQ1BBTi5yZHMiKSU+JSBtdXRhdGUoVmFyaWFudCA9ICJCQTJfNzUiKQpCQTI3NV9NVVRBVElPTlMgPSByZWFkUkRTKCJPTUlDUk9OX1NVQlZBUklBTlRTX0FOQUxZU0lTL0JBMjc1X0VQSVRPUEVfTVVUQVRJT05TLnJkcyIpICU+JSBtdXRhdGUoVmFyaWFudCA9ICJCQTJfNzUiKQoKRlVMTF9NVVRBVElPTlNfRFRfQkEyNzUgPSBCQTI3NV9NVVRBVElPTlMgJT4lIGlubmVyX2pvaW4oQkEyNzVfV1RfQklORElOR19TQ09SRVMpICU+JSBpbm5lcl9qb2luKEJBMjc1X01UX0JJTkRJTkdfU0NPUkVTKQoKCkZVTExfTVVUQVRJT05TX0RUX0JBNCA9IEJBNF9NVVRBVElPTlMgJT4lIGlubmVyX2pvaW4oQkE0X1dUX0JJTkRJTkdfU0NPUkVTKSAlPiUgaW5uZXJfam9pbihCQTRfTVRfQklORElOR19TQ09SRVMpCgojRlVMTF9NVVRBVElPTlNfRFRfT0xEX0JBMj1PTERfQkEyX01VVEFUSU9OUyAlPiUgaW5uZXJfam9pbihPTERfQkEyX1dUX0JJTkRJTkdfU0NPUkVTKSAlPiUgaW5uZXJfam9pbihPTERfQkEyX01UX0JJTkRJTkdfU0NPUkVTKQoKRlVMTF9NVVRBVElPTlNfRFRfQkEyPUJBMl9NVVRBVElPTlMgJT4lIGlubmVyX2pvaW4oQkEyX1dUX0JJTkRJTkdfU0NPUkVTKSAlPiUgaW5uZXJfam9pbihCQTJfTVRfQklORElOR19TQ09SRVMpCkZVTExfTVVUQVRJT05TX0RUX0JBNT1CQTVfTVVUQVRJT05TICU+JSBpbm5lcl9qb2luKEJBNV9XVF9CSU5ESU5HX1NDT1JFUykgJT4lIGlubmVyX2pvaW4oQkE1X01UX0JJTkRJTkdfU0NPUkVTKQoKRlVMTF9NVVRBVElPTlNfRFQgPSByYmluZChGVUxMX01VVEFUSU9OU19EVF9CQTIsIEZVTExfTVVUQVRJT05TX0RUX0JBNSwgRlVMTF9NVVRBVElPTlNfRFRfQkE0KQpGVUxMX01VVEFUSU9OU19EVD1GVUxMX01VVEFUSU9OU19EVCU+JSB1bmdyb3VwKCkKc2F2ZVJEUyhGVUxMX01VVEFUSU9OU19EVCwiU1VCVkFSSUFOVFNfRlVMTF9NVVRBVElPTlNfRFQucmRzIikKIyMgTVVUQVRJT05TX0RUX1NVQlZBUgpTVUJWQVJfTVVUQVRJT05TPUJBMl9NVVRBVElPTlMgJT4lIHJiaW5kKEJBNF9NVVRBVElPTlMpJT4lIHJiaW5kKEJBNV9NVVRBVElPTlMpIyU+JSByYmluZChCQTI3NV9NVVRBVElPTlMpCgpNVVRBVElPTl9MSVNUPSBmcmVhZCgiU1VCVkFSSUFOVF9TTlBTLmNzdiIpCk1VVEFUSU9OX0xJU1Q9TVVUQVRJT05fTElTVCAlPiUgbXV0YXRlKE11dGF0aW9uUG9zID0gcGFyc2VfbnVtYmVyKE11dGF0aW9uKSkKClNVQlZBUl9NVVRBVElPTlM9U1VCVkFSX01VVEFUSU9OUyAlPiUgc2VwYXJhdGVfcm93c18oY29scyA9ICJNdXRhdGlvblBvcyIsc2VwPSIsIiklPiUgbXV0YXRlKE11dGF0aW9uUG9zID1hcy5udW1lcmljKE11dGF0aW9uUG9zKSkgJT4lIGxlZnRfam9pbihNVVRBVElPTl9MSVNUKQpTVUJWQVJfTVVUQVRJT05TPVNVQlZBUl9NVVRBVElPTlMgJT4lIGdyb3VwX2J5KFBlcHRpZGUsIFZhcmlhbnRBbGlnbm1lbnQsc3RhcnRfcG9zLFByb3RlaW4sVmFyaWFudCklPiUKICBkcGx5cjo6c3VtbWFyaXNlKE11dGF0aW9uUG9zPXBhc3RlMChNdXRhdGlvblBvcyxjb2xsYXBzZSA9ICIsIiksCiAgICAgICAgICAgICAgICAgICBNdXRhdGlvbiA9IHBhc3RlMChNdXRhdGlvbiwgY29sbGFwc2UgPSAiLCIpKSU+JSB1bmdyb3VwClNVQlZBUl9NVVRBVElPTlM9U1VCVkFSX01VVEFUSU9OUyAlPiUgbXV0YXRlKEhhbW1pbmcgPSBzdHJpbmdkaXN0OjpzdHJpbmdkaXN0KFBlcHRpZGUsVmFyaWFudEFsaWdubWVudCxtZXRob2Q9ImhhbW1pbmciKSkKCiNzYXZlUkRTKFNVQlZBUl9NVVRBVElPTlMsIk9NSUNST05fRVBJVE9QRV9NVVRBVElPTlNfU1VCVkFSLnJkcyIpCgpgYGAKCiMgQ29tcGFyZSBvbGQgdnMgLiBuZXcgQkEyCgpgYGB7cn0KCkFHUkVUT1BJQ0lUWV9EVF9CQTI9RlVMTF9NVVRBVElPTlNfRFRfQkEyICU+JSB1bmdyb3VwJT4lIHNlbGVjdChQZXB0aWRlLCBWYXJpYW50QWxpZ25tZW50LCBQcm90ZWluLCBQcmVkaWN0ZWRfQmluZGluZywgbk1fNDEsIE1UX25NXzQxLEJpbmRlcixNVF9CaW5kZXIpICU+JQogICAgICAgIHNlcGFyYXRlX3Jvd3NfKGNvbHMgPSBjKCJQcmVkaWN0ZWRfQmluZGluZyIsIm5NXzQxIiwiTVRfbk1fNDEiLCJCaW5kZXIiLCJNVF9CaW5kZXIiKSxzZXA9IiwiKSAlPiUgbXV0YXRlKG5NXzQxID0gYXMubnVtZXJpYyhuTV80MSkpICU+JSBtdXRhdGUoTVRfbk1fNDEgPSBhcy5udW1lcmljKE1UX25NXzQxKSklPiUgbXV0YXRlKEFncmV0b3BpY2l0eSA9IE1UX25NXzQxL25NXzQxKQoKI0FHUkVUT1BJQ0lUWV9EVF9PTERfQkEyPUZVTExfTVVUQVRJT05TX0RUX09MRF9CQTIlPiUgdW5ncm91cCAlPiUgc2VsZWN0KFBlcHRpZGUsIFZhcmlhbnRBbGlnbm1lbnQsIFByb3RlaW4sIFByZWRpY3RlZF9CaW5kaW5nLCBuTV80MSwgTVRfbk1fNDEsQmluZGVyLE1UX0JpbmRlcikgJT4lCiAjICAgICAgIHNlcGFyYXRlX3Jvd3NfKGNvbHMgPSBjKCJQcmVkaWN0ZWRfQmluZGluZyIsIm5NXzQxIiwiTVRfbk1fNDEiLCJCaW5kZXIiLCJNVF9CaW5kZXIiKSxzZXA9IiwiKSAlPiUgbXV0YXRlKG5NXzQxID0gYXMubnVtZXJpYyhuTV80MSkpICU+JSBtdXRhdGUoTVRfbk1fNDEgPSBhcy5udW1lcmljKE1UX25NXzQxKSklPiUgbXV0YXRlKEFncmV0b3BpY2l0eSA9IE1UX25NXzQxL25NXzQxKQoKQUdSRVRPUElDSVRZX0RUX0JBMiAlPiUgbnJvdwojQUdSRVRPUElDSVRZX0RUX09MRF9CQTIgJT4lIG5yb3cKCiNzZXRkaWZmKEFHUkVUT1BJQ0lUWV9EVF9CQTIsIEFHUkVUT1BJQ0lUWV9EVF9PTERfQkEyKQoKYGBgCgojIENyZWF0ZSBBZ3JldG9waWNpdHkgRFQKCmBgYHtyfQoKCkFHUkVUT1BJQ0lUWV9EVD1GVUxMX01VVEFUSU9OU19EVCAlPiUgc2VsZWN0KFBlcHRpZGUsIFZhcmlhbnRBbGlnbm1lbnQsIFByb3RlaW4sIFByZWRpY3RlZF9CaW5kaW5nLCBuTV80MSwgTVRfbk1fNDEsQmluZGVyLE1UX0JpbmRlciwgVmFyaWFudCkgJT4lCiAgICAgICAgc2VwYXJhdGVfcm93c18oY29scyA9IGMoIlByZWRpY3RlZF9CaW5kaW5nIiwibk1fNDEiLCJNVF9uTV80MSIsIkJpbmRlciIsIk1UX0JpbmRlciIpLHNlcD0iLCIpICU+JSBtdXRhdGUobk1fNDEgPSBhcy5udW1lcmljKG5NXzQxKSkgJT4lIG11dGF0ZShNVF9uTV80MSA9IGFzLm51bWVyaWMoTVRfbk1fNDEpKQpBR1JFVE9QSUNJVFlfRFQgJT4lIGhlYWQKQUdSRVRPUElDSVRZX0RUPUFHUkVUT1BJQ0lUWV9EVCAlPiUgbXV0YXRlKEFncmV0b3BpY2l0eSA9IE1UX25NXzQxL25NXzQxKQoKU1BJS0VfQUdSRVRPUElDSVRZPUFHUkVUT1BJQ0lUWV9EVCAlPiUgZmlsdGVyKFByb3RlaW4gPT0gJ3N1cmZhY2UgZ2x5Y29wcm90ZWluJykgJT4lIG11dGF0ZShMZW5ndGggPSBuY2hhcihQZXB0aWRlKSkKClNQSUtFX0FHUkVUT1BJQ0lUWSAlPiUgZ3JvdXBfYnkoVmFyaWFudCklPiUgZHBseXI6OnN1bW1hcmlzZShtZWFuQWcgPSBtZWFuKEFncmV0b3BpY2l0eSkpCgpzYXZlUkRTKEFHUkVUT1BJQ0lUWV9EVCwiU1VCVkFSSUFOVFNfQUdSRVRPUElDSVRZX0RULnJkcyIpCgpgYGAKCgpgYGB7cn0KClNQSUtFX0FHUkVUT1BJQ0lUWT1TUElLRV9BR1JFVE9QSUNJVFkgJT4lIGZpbHRlcighIChCaW5kZXIgPT0gIk5PTkJJTkRFUiIgJiBNVF9CaW5kZXIgPT0gIk5PTkJJTkRFUiIpKSU+JSB1bmdyb3VwClNQSUtFX0FHUkVUT1BJQ0lUWSAlPiUgc2VsZWN0KFBlcHRpZGUsVmFyaWFudEFsaWdubWVudCkgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3cKU1BJS0VfQUdSRVRPUElDSVRZICU+JSBncm91cF9ieShWYXJpYW50LFBlcHRpZGUpICU+JSBkcGx5cjo6c3VtbWFyaXNlKG49bigpKQpTUElLRV9BR1JFVE9QSUNJVFkgJT4lIG5yb3cKClNQSUtFX0FHUkVUT1BJQ0lUWSAlPiUgZ3JvdXBfYnkoVmFyaWFudCklPiUgZHBseXI6OnN1bW1hcmlzZShtZWFuQWcgPSBtZWFuKEFncmV0b3BpY2l0eSkpCgpgYGAKCgoKCgpgYGB7cixkcGk9MzAwLCBmaWcud2lkdGggPSAxMH0KU1BJS0VfQUdSRVRPUElDSVRZICU+JSBzZWxlY3QoUGVwdGlkZSwgbk1fNDEsIE1UX25NXzQxLCBWYXJpYW50KSU+JSBwaXZvdF9sb25nZXIoY29scyA9IGMobk1fNDEsTVRfbk1fNDEpLCBuYW1lc190byA9ICJEYXRhc2V0Iix2YWx1ZXNfdG8gPSAiQWZmIiklPiUKICBtdXRhdGUoRGF0YXNldCA9IGZhY3RvcihEYXRhc2V0LCBsZXZlbHMgPSBjKCJuTV80MSIsIk1UX25NXzQxIikpKSU+JQogICAgICAgIGdncGxvdChhZXMoeD1BZmYsIGNvbG9yPURhdGFzZXQpKStzdGF0X2VjZGYoc2l6ZT0xKStmYWNldF9ncmlkKH5WYXJpYW50KSt0aGVtZV9wdWJyKGJhc2Vfc2l6ZSA9IDE2KStncmlkcygpKyBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobnJvdyA9IDIpKSt5bGFiKCJDdW11bGF0aXZlIEZyZXEuIG9mIFBlcHRpZGVzIikreGxhYigiQmluZGluZyBBZmZpbml0eVxuKG5NKSIpK2dlb21fdmxpbmUoeGludGVyY2VwdCA9IDUwMCxsaW5ldHlwZT0iZGFzaGVkIixhbHBoYT0wLjUpCgpTVUJWQVJfRUNERl9QTFQ9U1BJS0VfQUdSRVRPUElDSVRZICU+JSBzZWxlY3QoUGVwdGlkZSwgbk1fNDEsIE1UX25NXzQxLCBWYXJpYW50KSU+JSBwaXZvdF9sb25nZXIoY29scyA9IGMobk1fNDEsTVRfbk1fNDEpLCBuYW1lc190byA9ICJEYXRhc2V0Iix2YWx1ZXNfdG8gPSAiQWZmIiklPiUKICBtdXRhdGUoRGF0YXNldCA9IHJlcGxhY2UoRGF0YXNldCwgRGF0YXNldCA9PSAibk1fNDEiLCAiV3VoYW4iKSklPiVtdXRhdGUoRGF0YXNldCA9IHJlcGxhY2UoRGF0YXNldCwgRGF0YXNldCA9PSAiTVRfbk1fNDEiLCAiT21pY3JvbiIpKSU+JQogIG11dGF0ZShEYXRhc2V0ID0gZmFjdG9yKERhdGFzZXQsIGxldmVscyA9IGMoIld1aGFuIiwiT21pY3JvbiIpKSklPiUKICAgICAgICBnZ3Bsb3QoYWVzKHg9QWZmLCBjb2xvcj1EYXRhc2V0KSkrc3RhdF9lY2RmKHNpemU9MSkrZmFjZXRfZ3JpZCh+VmFyaWFudCkrdGhlbWVfcHVicihiYXNlX3NpemUgPSAxNikrZ3JpZHMoKSsgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAyKSkreWxhYigiQ3VtdWxhdGl2ZSBGcmVxLiBvZiBQZXB0aWRlcyIpK3hsYWIoIkxvZzEwIEJpbmRpbmcgQWZmaW5pdHlcbihuTSkiKStnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1MDAsbGluZXR5cGU9ImRhc2hlZCIsYWxwaGE9MC41KStzY2FsZV94X2xvZzEwKCkKU1VCVkFSX0VDREZfUExUCnNhdmVSRFMoU1VCVkFSX0VDREZfUExULCAiU1VCVkFSX0VDREZfUExULnJkcyIpCgpTVUJWQVJfVklPTElOX1BMVD1TUElLRV9BR1JFVE9QSUNJVFkgJT4lIHNlbGVjdChQZXB0aWRlLCBuTV80MSwgTVRfbk1fNDEsIFZhcmlhbnQpJT4lIHBpdm90X2xvbmdlcihjb2xzID0gYyhuTV80MSxNVF9uTV80MSksIG5hbWVzX3RvID0gIkRhdGFzZXQiLHZhbHVlc190byA9ICJBZmYiKSAlPiUKICBtdXRhdGUoRGF0YXNldCA9IHJlcGxhY2UoRGF0YXNldCwgRGF0YXNldCA9PSAibk1fNDEiLCAiV3VoYW4iKSklPiVtdXRhdGUoRGF0YXNldCA9IHJlcGxhY2UoRGF0YXNldCwgRGF0YXNldCA9PSAiTVRfbk1fNDEiLCAiT21pY3JvbiIpKSU+JQogIG11dGF0ZShEYXRhc2V0ID0gZmFjdG9yKERhdGFzZXQsIGxldmVscyA9IGMoIld1aGFuIiwiT21pY3JvbiIpKSklPiUKICAgICAgICAgZ2d2aW9saW4oeD0iRGF0YXNldCIseT0iQWZmIixjb2xvciA9ICJEYXRhc2V0IixhZGQ9ImJveHBsb3QiLHRyaW09VFJVRSkrZmFjZXRfZ3JpZCh+VmFyaWFudCkrdGhlbWVfcHVicihiYXNlX3NpemUgPSAxNikrc2NhbGVfeV9sb2cxMCgpK3N0YXRfY29tcGFyZV9tZWFucygpK3lsYWIoIkJpbmRpbmcgQWZmaW5pdHlcbihuTSkiKQpTVUJWQVJfVklPTElOX1BMVAoKU1VCVkFSX1ZJT0xJTl9QTFQ9U1BJS0VfQUdSRVRPUElDSVRZICU+JSBzZWxlY3QoUGVwdGlkZSwgbk1fNDEsIE1UX25NXzQxLCBWYXJpYW50KSU+JSBwaXZvdF9sb25nZXIoY29scyA9IGMobk1fNDEsTVRfbk1fNDEpLCBuYW1lc190byA9ICJEYXRhc2V0Iix2YWx1ZXNfdG8gPSAiQWZmIikgJT4lCiAgbXV0YXRlKERhdGFzZXQgPSByZXBsYWNlKERhdGFzZXQsIERhdGFzZXQgPT0gIm5NXzQxIiwgIld1aGFuIikpJT4lbXV0YXRlKERhdGFzZXQgPSByZXBsYWNlKERhdGFzZXQsIERhdGFzZXQgPT0gIk1UX25NXzQxIiwgIk9taWNyb24iKSklPiUKICBtdXRhdGUoRGF0YXNldCA9IGZhY3RvcihEYXRhc2V0LCBsZXZlbHMgPSBjKCJXdWhhbiIsIk9taWNyb24iKSkpJT4lCiAgICAgICAgIGdndmlvbGluKHg9IkRhdGFzZXQiLHk9IkFmZiIsY29sb3IgPSAiRGF0YXNldCIsYWRkPSJib3hwbG90Iix0cmltPVRSVUUpK2ZhY2V0X2dyaWQoflZhcmlhbnQpK3RoZW1lX3B1YnIoYmFzZV9zaXplID0gMTYpK3NjYWxlX3lfbG9nMTAoKStzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5zaWduaWYiLGxhYmVsLngubnBjID0gImNlbnRlciIpK3lsYWIoIkJpbmRpbmcgQWZmaW5pdHlcbihuTSkiKQpTVUJWQVJfVklPTElOX1BMVAoKc2F2ZVJEUyhTVUJWQVJfVklPTElOX1BMVCwgIlNVQlZBUl9WSU9MSU5fUExULnJkcyIpCgoKYGBgCgoKYGBge3J9CkFCX1NVUEVSVFlQRVM9ZnJlYWQoIkhMQV9BQl9TVVBFUlRZUEVTLmNzdiIpICU+JSBtdXRhdGUoQWxsZWxlID0gZ3N1YigiXFwqIiwiIixBbGxlbGUpKSU+JSBtdXRhdGUoQWxsZWxlID0gcGFzdGUwKCJITEEtIixBbGxlbGUpKSU+JSBkcGx5cjo6cmVuYW1lKEhMQV9BbGxlbGUgPSBBbGxlbGUpCgpEQVRBX0ZPUl9BTkFMWVNJUz1GVUxMX01VVEFUSU9OU19EVCU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihQcm90ZWluID09ICJzdXJmYWNlIGdseWNvcHJvdGVpbiIpICU+JSBzZWxlY3QoUGVwdGlkZSwgVmFyaWFudEFsaWdubWVudCwgUHJlZGljdGVkX0JpbmRpbmcsIG5NXzQxLCBNVF9uTV80MSwgQmluZGVyLE1UX0JpbmRlcixWYXJpYW50KSAlPiUgc2VwYXJhdGVfcm93c18oY29scyA9IGMoIlByZWRpY3RlZF9CaW5kaW5nIiwibk1fNDEiLCJNVF9uTV80MSIsIkJpbmRlciIsIk1UX0JpbmRlciIpLHNlcD0iLCIpJT4lIG11dGF0ZShuTV80MSA9IGFzLm51bWVyaWMobk1fNDEpLCBNVF9uTV80MT1hcy5udW1lcmljKE1UX25NXzQxKSklPiUgbXV0YXRlKEFncmV0b3BpY2l0eSA9IE1UX25NXzQxL25NXzQxKQoKSExBX0FfQl9BR1JFVE9QSUNJVFk9REFUQV9GT1JfQU5BTFlTSVMgJT4lIGRwbHlyOjpyZW5hbWUoSExBX0FsbGVsZT1QcmVkaWN0ZWRfQmluZGluZyklPiUgZmlsdGVyKEhMQV9BbGxlbGUgJWluJSBncmVwKCJITEEtQXxITEEtQiIsSExBX0FsbGVsZSx2YWx1ZSA9IFQpKSAlPiUgaW5uZXJfam9pbihBQl9TVVBFUlRZUEVTKSAlPiUKZmlsdGVyKCEgKEJpbmRlciA9PSAiTk9OQklOREVSIiAmIE1UX0JpbmRlciA9PSAnTk9OQklOREVSJykpCgpITEFfQ0RBVEFTRVRfQUdSRVRPUElDSVRZPURBVEFfRk9SX0FOQUxZU0lTICU+JSBkcGx5cjo6cmVuYW1lKEhMQV9BbGxlbGU9UHJlZGljdGVkX0JpbmRpbmcpJT4lIGZpbHRlcighSExBX0FsbGVsZSAlaW4lIGdyZXAoIkhMQS1BfEhMQS1CIixITEFfQWxsZWxlLHZhbHVlID0gVCkpJT4lIG11dGF0ZShTdXBlcnR5cGUgPSBzdHJfZXh0cmFjdChITEFfQWxsZWxlLCJITEEtQ1swLTldWzAtOV0iKSklPiUKICAgICAgICBtdXRhdGUoU3VwZXJ0eXBlID0gZ3N1YigiSExBXFwtIiwiIixTdXBlcnR5cGUpKSU+JQpmaWx0ZXIoISAoQmluZGVyID09ICJOT05CSU5ERVIiICYgTVRfQmluZGVyID09ICdOT05CSU5ERVInKSkKCmBgYAoKCgoKYGBge3IsZHBpPTMwMCwgZmlnLndpZHRoICA9IDExLCBmaWcuaGVpZ2h0ID0gMTB9CgpWQVJJQU5UID0gIkJBMiIKSExBX0FfQl9BR1JFVE9QSUNJVFkgJT4lIHJiaW5kKEhMQV9DREFUQVNFVF9BR1JFVE9QSUNJVFkpJT4lIGZpbHRlcihWYXJpYW50ID09IFZBUklBTlQpICU+JQogICAgICAgIGdncGFpcmVkKGNvbmQxID0gIm5NXzQxIiwgY29uZDIgPSAiTVRfbk1fNDEiLGxpbmUuY29sb3IgPSAiZ3JheSIpK2ZhY2V0X3dyYXAoflN1cGVydHlwZSxuY29sPTkpK3RoZW1lX3B1YnIoYmFzZV9zaXplID0gMTYpK3NjYWxlX3lfbG9nMTAoKStzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5zaWduaWYiLGxhYmVsLngubnBjID0gImNlbnRlciIpK3JvdGF0ZV94X3RleHQoYW5nbGU9NDUpK3lsYWIoIkxvZzEwIEJpbmRpbmcgQWZmaW5pdHkgKG5NKSIpK2dndGl0bGUoVkFSSUFOVCkKClZBUklBTlQgPSAiQkE0IgpITEFfQV9CX0FHUkVUT1BJQ0lUWSAlPiUgcmJpbmQoSExBX0NEQVRBU0VUX0FHUkVUT1BJQ0lUWSklPiUgZmlsdGVyKFZhcmlhbnQgPT0gVkFSSUFOVCkgJT4lCiAgICAgICAgZ2dwYWlyZWQoY29uZDEgPSAibk1fNDEiLCBjb25kMiA9ICJNVF9uTV80MSIsbGluZS5jb2xvciA9ICJncmF5IikrZmFjZXRfd3JhcCh+U3VwZXJ0eXBlLG5jb2w9OSkrdGhlbWVfcHVicihiYXNlX3NpemUgPSAxNikrc2NhbGVfeV9sb2cxMCgpK3N0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLnNpZ25pZiIsbGFiZWwueC5ucGMgPSAiY2VudGVyIikrcm90YXRlX3hfdGV4dChhbmdsZT00NSkreWxhYigiTG9nMTAgQmluZGluZyBBZmZpbml0eSAobk0pIikrZ2d0aXRsZShWQVJJQU5UKQoKVkFSSUFOVCA9ICJCQTUiCkhMQV9BX0JfQUdSRVRPUElDSVRZICU+JSByYmluZChITEFfQ0RBVEFTRVRfQUdSRVRPUElDSVRZKSU+JSBmaWx0ZXIoVmFyaWFudCA9PSBWQVJJQU5UKSAlPiUKICAgICAgICBnZ3BhaXJlZChjb25kMSA9ICJuTV80MSIsIGNvbmQyID0gIk1UX25NXzQxIixsaW5lLmNvbG9yID0gImdyYXkiKStmYWNldF93cmFwKH5TdXBlcnR5cGUsbmNvbD05KSt0aGVtZV9wdWJyKGJhc2Vfc2l6ZSA9IDE2KStzY2FsZV95X2xvZzEwKCkrc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuc2lnbmlmIixsYWJlbC54Lm5wYyA9ICJjZW50ZXIiKStyb3RhdGVfeF90ZXh0KGFuZ2xlPTQ1KSt5bGFiKCJMb2cxMCBCaW5kaW5nIEFmZmluaXR5IChuTSkiKStnZ3RpdGxlKFZBUklBTlQpCgojVkFSSUFOVCA9ICJCQTJfNzUiCiNITEFfQV9CX0FHUkVUT1BJQ0lUWSAlPiUgcmJpbmQoSExBX0NEQVRBU0VUX0FHUkVUT1BJQ0lUWSklPiUgZmlsdGVyKFZhcmlhbnQgPT0gVkFSSUFOVCkgJT4lCiAjICAgICAgIGdncGFpcmVkKGNvbmQxID0gIm5NXzQxIiwgY29uZDIgPSAiTVRfbk1fNDEiLGxpbmUuY29sb3IgPSAiZ3JheSIpK2ZhY2V0X3dyYXAoflN1cGVydHlwZSxuY29sPTkpK3RoZW1lX3B1YnIoYmFzZV9zaXplID0gMTYpK3NjYWxlX3lfbG9nMTAoKStzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5zaWduaWYiLGxhYmVsLngubnBjID0gIyJjZW50ZXIiKStyb3RhdGVfeF90ZXh0KGFuZ2xlPTQ1KSt5bGFiKCJMb2cxMCBCaW5kaW5nIEFmZmluaXR5IChuTSkiKStnZ3RpdGxlKFZBUklBTlQpCgoKSExBX0FfQl9BR1JFVE9QSUNJVFkgJT4lIHJiaW5kKEhMQV9DREFUQVNFVF9BR1JFVE9QSUNJVFkpJT4lIHNlbGVjdCghVmFyaWFudCklPiUgZGlzdGluY3QoKSU+JQogICAgICAgIGdncGFpcmVkKGNvbmQxID0gIm5NXzQxIiwgY29uZDIgPSAiTVRfbk1fNDEiLGxpbmUuY29sb3IgPSAiZ3JheSIpK2ZhY2V0X3dyYXAoflN1cGVydHlwZSxuY29sPTkpK3RoZW1lX3B1YnIoYmFzZV9zaXplID0gMTYpK3NjYWxlX3lfbG9nMTAoKStzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5zaWduaWYiLGxhYmVsLngubnBjID0gImNlbnRlciIpK3JvdGF0ZV94X3RleHQoYW5nbGU9NDUpK3lsYWIoIkxvZzEwIEJpbmRpbmcgQWZmaW5pdHkgKG5NKSIpK2dndGl0bGUoIkFMTCIpCgoKCgoKYGBgCgoKCgoKYGBge3IsZHBpPTMwMCwgZmlnLndpZHRoICA9IDExLCBmaWcuaGVpZ2h0ID0gMTJ9CgpTVUJWQVJfU1VQRVJUWVBFX0JPWFBMVD1ITEFfQV9CX0FHUkVUT1BJQ0lUWSAlPiUgcmJpbmQoSExBX0NEQVRBU0VUX0FHUkVUT1BJQ0lUWSklPiUgZmlsdGVyKFN1cGVydHlwZSAlaW4lIGMoIkEwMiIsIkEwMyIsIkIwNyIsIkMwMSIpKSU+JQogICAgICAgIGRwbHlyOjpyZW5hbWUoV3VoYW49bk1fNDEsIE9taWNyb24gPSBNVF9uTV80MSklPiUKICAgICAgICBnZ3BhaXJlZChjb25kMSA9ICJXdWhhbiIsIGNvbmQyID0gIk9taWNyb24iLGxpbmUuY29sb3IgPSAiZ3JheSIpK2ZhY2V0X3dyYXAoVmFyaWFudH5TdXBlcnR5cGUpK3RoZW1lX3B1YnIoYmFzZV9zaXplID0gMTYpK3NjYWxlX3lfbG9nMTAoKStzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5zaWduaWYiLGxhYmVsLngubnBjID0gImNlbnRlciIpK3JvdGF0ZV94X3RleHQoYW5nbGU9NDUpK3lsYWIoIkxvZzEwIEJpbmRpbmcgQWZmaW5pdHkgKG5NKSIpCgpTVUJWQVJfU1VQRVJUWVBFX0JPWFBMVApzYXZlUkRTKFNVQlZBUl9TVVBFUlRZUEVfQk9YUExULGZpbGU9IlNVQlZBUl9TVVBFUlRZUEVfQk9YUExULnJkcyIpCgpgYGAKCiMgQWxsIHByb3RlaW4KCmBgYHtyfQpBQl9TVVBFUlRZUEVTPWZyZWFkKCJITEFfQUJfU1VQRVJUWVBFUy5jc3YiKSAlPiUgbXV0YXRlKEFsbGVsZSA9IGdzdWIoIlxcKiIsIiIsQWxsZWxlKSklPiUgbXV0YXRlKEFsbGVsZSA9IHBhc3RlMCgiSExBLSIsQWxsZWxlKSklPiUgZHBseXI6OnJlbmFtZShITEFfQWxsZWxlID0gQWxsZWxlKQoKREFUQV9GT1JfQU5BTFlTSVM9RlVMTF9NVVRBVElPTlNfRFQlPiUgdW5ncm91cCgpICAlPiUgc2VsZWN0KFBlcHRpZGUsIFZhcmlhbnRBbGlnbm1lbnQsIFByZWRpY3RlZF9CaW5kaW5nLCBuTV80MSwgTVRfbk1fNDEsIEJpbmRlcixNVF9CaW5kZXIsVmFyaWFudCkgJT4lIHNlcGFyYXRlX3Jvd3NfKGNvbHMgPSBjKCJQcmVkaWN0ZWRfQmluZGluZyIsIm5NXzQxIiwiTVRfbk1fNDEiLCJCaW5kZXIiLCJNVF9CaW5kZXIiKSxzZXA9IiwiKSU+JSBtdXRhdGUobk1fNDEgPSBhcy5udW1lcmljKG5NXzQxKSwgTVRfbk1fNDE9YXMubnVtZXJpYyhNVF9uTV80MSkpJT4lIG11dGF0ZShBZ3JldG9waWNpdHkgPSBNVF9uTV80MS9uTV80MSkKCkhMQV9BX0JfQUdSRVRPUElDSVRZPURBVEFfRk9SX0FOQUxZU0lTICU+JSBkcGx5cjo6cmVuYW1lKEhMQV9BbGxlbGU9UHJlZGljdGVkX0JpbmRpbmcpJT4lIGZpbHRlcihITEFfQWxsZWxlICVpbiUgZ3JlcCgiSExBLUF8SExBLUIiLEhMQV9BbGxlbGUsdmFsdWUgPSBUKSkgJT4lIGlubmVyX2pvaW4oQUJfU1VQRVJUWVBFUykgJT4lCmZpbHRlcighIChCaW5kZXIgPT0gIk5PTkJJTkRFUiIgJiBNVF9CaW5kZXIgPT0gJ05PTkJJTkRFUicpKQoKSExBX0NEQVRBU0VUX0FHUkVUT1BJQ0lUWT1EQVRBX0ZPUl9BTkFMWVNJUyAlPiUgZHBseXI6OnJlbmFtZShITEFfQWxsZWxlPVByZWRpY3RlZF9CaW5kaW5nKSU+JSBmaWx0ZXIoIUhMQV9BbGxlbGUgJWluJSBncmVwKCJITEEtQXxITEEtQiIsSExBX0FsbGVsZSx2YWx1ZSA9IFQpKSU+JSBtdXRhdGUoU3VwZXJ0eXBlID0gc3RyX2V4dHJhY3QoSExBX0FsbGVsZSwiSExBLUNbMC05XVswLTldIikpJT4lCiAgICAgICAgbXV0YXRlKFN1cGVydHlwZSA9IGdzdWIoIkhMQVxcLSIsIiIsU3VwZXJ0eXBlKSklPiUKZmlsdGVyKCEgKEJpbmRlciA9PSAiTk9OQklOREVSIiAmIE1UX0JpbmRlciA9PSAnTk9OQklOREVSJykpCgpgYGAKCgoKCmBgYHtyLGRwaT0zMDAsIGZpZy53aWR0aCAgPSAxMSwgZmlnLmhlaWdodCA9IDEwfQoKVkFSSUFOVCA9ICJCQTIiCkhMQV9BX0JfQUdSRVRPUElDSVRZICU+JSByYmluZChITEFfQ0RBVEFTRVRfQUdSRVRPUElDSVRZKSU+JSBmaWx0ZXIoVmFyaWFudCA9PSBWQVJJQU5UKSAlPiUKICAgICAgICBnZ3BhaXJlZChjb25kMSA9ICJuTV80MSIsIGNvbmQyID0gIk1UX25NXzQxIixsaW5lLmNvbG9yID0gImdyYXkiKStmYWNldF93cmFwKH5TdXBlcnR5cGUsbmNvbD05KStzY2FsZV95X2xvZzEwKCkrc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuc2lnbmlmIixsYWJlbC54Lm5wYyA9ICJjZW50ZXIiLHBhaXJlZCA9IFRSVUUpK3JvdGF0ZV94X3RleHQoYW5nbGU9NDUpK3lsYWIoIkxvZzEwIEJpbmRpbmcgQWZmaW5pdHkgKG5NKSIpK2dndGl0bGUoVkFSSUFOVCkKClZBUklBTlQgPSAiQkE0IgpITEFfQV9CX0FHUkVUT1BJQ0lUWSAlPiUgcmJpbmQoSExBX0NEQVRBU0VUX0FHUkVUT1BJQ0lUWSklPiUgZmlsdGVyKFZhcmlhbnQgPT0gVkFSSUFOVCkgJT4lCiAgICAgICAgZ2dwYWlyZWQoY29uZDEgPSAibk1fNDEiLCBjb25kMiA9ICJNVF9uTV80MSIsbGluZS5jb2xvciA9ICJncmF5IikrZmFjZXRfd3JhcCh+U3VwZXJ0eXBlLG5jb2w9OSkrc2NhbGVfeV9sb2cxMCgpK3N0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLnNpZ25pZiIsbGFiZWwueC5ucGMgPSAiY2VudGVyIixwYWlyZWQgPSBUUlVFKStyb3RhdGVfeF90ZXh0KGFuZ2xlPTQ1KSt5bGFiKCJMb2cxMCBCaW5kaW5nIEFmZmluaXR5IChuTSkiKStnZ3RpdGxlKFZBUklBTlQpCgpWQVJJQU5UID0gIkJBNSIKSExBX0FfQl9BR1JFVE9QSUNJVFkgJT4lIHJiaW5kKEhMQV9DREFUQVNFVF9BR1JFVE9QSUNJVFkpJT4lIGZpbHRlcihWYXJpYW50ID09IFZBUklBTlQpICU+JQogICAgICAgIGdncGFpcmVkKGNvbmQxID0gIm5NXzQxIiwgY29uZDIgPSAiTVRfbk1fNDEiLGxpbmUuY29sb3IgPSAiZ3JheSIpK2ZhY2V0X3dyYXAoflN1cGVydHlwZSxuY29sPTkpK3NjYWxlX3lfbG9nMTAoKStzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5zaWduaWYiLGxhYmVsLngubnBjID0gImNlbnRlciIscGFpcmVkID0gVFJVRSkrcm90YXRlX3hfdGV4dChhbmdsZT00NSkreWxhYigiTG9nMTAgQmluZGluZyBBZmZpbml0eSAobk0pIikrZ2d0aXRsZShWQVJJQU5UKQoKI1ZBUklBTlQgPSAiQkEyXzc1IgojSExBX0FfQl9BR1JFVE9QSUNJVFkgJT4lIHJiaW5kKEhMQV9DREFUQVNFVF9BR1JFVE9QSUNJVFkpJT4lIGZpbHRlcihWYXJpYW50ID09IFZBUklBTlQpICU+JQogIyAgICAgICBnZ3BhaXJlZChjb25kMSA9ICJuTV80MSIsIGNvbmQyID0gIk1UX25NXzQxIixsaW5lLmNvbG9yID0gImdyYXkiKStmYWNldF93cmFwKH5TdXBlcnR5cGUsbmNvbD05KStzY2FsZV95X2xvZzEwKCkrc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuc2lnbmlmIixsYWJlbC54Lm5wYyA9ICJjZW50ZXIiLHBhaXJlZCA9IFRSVUUpKyNyb3RhdGVfeF90ZXh0KGFuZ2xlPTQ1KSt5bGFiKCJMb2cxMCBCaW5kaW5nIEFmZmluaXR5IChuTSkiKStnZ3RpdGxlKFZBUklBTlQpCgpITEFfQV9CX0FHUkVUT1BJQ0lUWSAlPiUgcmJpbmQoSExBX0NEQVRBU0VUX0FHUkVUT1BJQ0lUWSklPiUgc2VsZWN0KCFWYXJpYW50KSU+JSBkaXN0aW5jdCgpJT4lCiAgICAgICAgZ2dwYWlyZWQoY29uZDEgPSAibk1fNDEiLCBjb25kMiA9ICJNVF9uTV80MSIsbGluZS5jb2xvciA9ICJncmF5IikrZmFjZXRfd3JhcCh+U3VwZXJ0eXBlLG5jb2w9OSkrc2NhbGVfeV9sb2cxMCgpK3N0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLnNpZ25pZiIsbGFiZWwueC5ucGMgPSAiY2VudGVyIixwYWlyZWQgPSBUUlVFKStyb3RhdGVfeF90ZXh0KGFuZ2xlPTQ1KSt5bGFiKCJMb2cxMCBCaW5kaW5nIEFmZmluaXR5IChuTSkiKStnZ3RpdGxlKCJBTEwiKQoKYGBgCgoKYGBge3J9CgpgYGAKCiMgU3VwcGxlbWVudGFyeQoKCmBgYHtyfQoKCkFHUkVUT1BJQ0lUWV9EVD1GVUxMX01VVEFUSU9OU19EVCAlPiUgc2VsZWN0KFBlcHRpZGUsIFZhcmlhbnRBbGlnbm1lbnQsIFByb3RlaW4sIFByZWRpY3RlZF9CaW5kaW5nLCBCQV9SYW5rLE1UX0JBX1JhbmssQmluZGVyLE1UX0JpbmRlciwgVmFyaWFudCkgJT4lCiAgICAgICAgc2VwYXJhdGVfcm93c18oY29scyA9IGMoIlByZWRpY3RlZF9CaW5kaW5nIiwiQkFfUmFuayIsIk1UX0JBX1JhbmsiLCJCaW5kZXIiLCJNVF9CaW5kZXIiKSxzZXA9IiwiKSAlPiUgbXV0YXRlKEJBX1JhbmsgPSBhcy5udW1lcmljKEJBX1JhbmspKSAlPiUgbXV0YXRlKE1UX0JBX1JhbmsgPSBhcy5udW1lcmljKE1UX0JBX1JhbmspKQpBR1JFVE9QSUNJVFlfRFQgJT4lIGhlYWQKCgpTUElLRV9BR1JFVE9QSUNJVFk9QUdSRVRPUElDSVRZX0RUICU+JSBmaWx0ZXIoUHJvdGVpbiA9PSAnc3VyZmFjZSBnbHljb3Byb3RlaW4nKSAlPiUgbXV0YXRlKExlbmd0aCA9IG5jaGFyKFBlcHRpZGUpKQoKCnNhdmVSRFMoQUdSRVRPUElDSVRZX0RULCJTVUJWQVJJQU5UU19BR1JFVE9QSUNJVFlfRFQucmRzIikKCmBgYAoKCmBgYHtyfQoKU1BJS0VfQUdSRVRPUElDSVRZICU+JSBzZWxlY3QoUGVwdGlkZSxWYXJpYW50QWxpZ25tZW50KSAlPiUgZGlzdGluY3QoKSAlPiUgbnJvdwpTUElLRV9BR1JFVE9QSUNJVFkgJT4lIGdyb3VwX2J5KFZhcmlhbnQsUGVwdGlkZSkgJT4lIGRwbHlyOjpzdW1tYXJpc2Uobj1uKCkpClNQSUtFX0FHUkVUT1BJQ0lUWSAlPiUgbnJvdwoKYGBgCgoKCgoKYGBge3IsZHBpPTMwMCwgZmlnLndpZHRoID0gMTB9ClNQSUtFX0FHUkVUT1BJQ0lUWT1TUElLRV9BR1JFVE9QSUNJVFkgJT4lIGZpbHRlcighIChCaW5kZXIgPT0gIk5PTkJJTkRFUiIgJiBNVF9CaW5kZXIgPT0gIk5PTkJJTkRFUiIpKSU+JSB1bmdyb3VwCgpTUElLRV9BR1JFVE9QSUNJVFkgJT4lIHNlbGVjdChQZXB0aWRlLCBCQV9SYW5rLCBNVF9CQV9SYW5rLCBWYXJpYW50KSU+JSBwaXZvdF9sb25nZXIoY29scyA9IGMoQkFfUmFuayxNVF9CQV9SYW5rKSwgbmFtZXNfdG8gPSAiRGF0YXNldCIsdmFsdWVzX3RvID0gIkFmZiIpJT4lCiAgbXV0YXRlKERhdGFzZXQgPSBmYWN0b3IoRGF0YXNldCwgbGV2ZWxzID0gYygiQkFfUmFuayIsIk1UX0JBX1JhbmsiKSkpJT4lCiAgICAgICAgZ2dwbG90KGFlcyh4PUFmZiwgY29sb3I9RGF0YXNldCkpK3N0YXRfZWNkZihzaXplPTEpK2ZhY2V0X2dyaWQoflZhcmlhbnQpK3RoZW1lX3B1YnIoYmFzZV9zaXplID0gMTYpK2dyaWRzKCkrIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChucm93ID0gMikpK3lsYWIoIkN1bXVsYXRpdmUgRnJlcS4gb2YgUGVwdGlkZXMiKSt4bGFiKCJCaW5kaW5nIEFmZmluaXR5XG4obk0pIikrZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMixsaW5ldHlwZT0iZGFzaGVkIixhbHBoYT0wLjUpCgpTVUJWQVJfRUNERl9QTFQ9U1BJS0VfQUdSRVRPUElDSVRZICU+JSBzZWxlY3QoUGVwdGlkZSwgQkFfUmFuaywgTVRfQkFfUmFuaywgVmFyaWFudCklPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKEJBX1JhbmssTVRfQkFfUmFuayksIG5hbWVzX3RvID0gIkRhdGFzZXQiLHZhbHVlc190byA9ICJBZmYiKSU+JQogIG11dGF0ZShEYXRhc2V0ID0gcmVwbGFjZShEYXRhc2V0LCBEYXRhc2V0ID09ICJCQV9SYW5rIiwgIld1aGFuIikpJT4lbXV0YXRlKERhdGFzZXQgPSByZXBsYWNlKERhdGFzZXQsIERhdGFzZXQgPT0gIk1UX0JBX1JhbmsiLCAiT21pY3JvbiIpKSU+JQogIG11dGF0ZShEYXRhc2V0ID0gZmFjdG9yKERhdGFzZXQsIGxldmVscyA9IGMoIld1aGFuIiwiT21pY3JvbiIpKSklPiUKICAgICAgICBnZ3Bsb3QoYWVzKHg9QWZmLCBjb2xvcj1EYXRhc2V0KSkrc3RhdF9lY2RmKHNpemU9MSkrZmFjZXRfZ3JpZCh+VmFyaWFudCkrdGhlbWVfcHVicihiYXNlX3NpemUgPSAxNikrZ3JpZHMoKSsgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAyKSkreWxhYigiQ3VtdWxhdGl2ZSBGcmVxLiBvZiBQZXB0aWRlcyIpK3hsYWIoIkxvZzEwIEJpbmRpbmcgQWZmaW5pdHlcbihuTSkiKStnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyLGxpbmV0eXBlPSJkYXNoZWQiLGFscGhhPTAuNSkrc2NhbGVfeF9sb2cxMCgpClNVQlZBUl9FQ0RGX1BMVApzYXZlUkRTKFNVQlZBUl9FQ0RGX1BMVCwgIlNVQlZBUl9SQU5LX0VDREZfUExULnJkcyIpCgpTVUJWQVJfVklPTElOX1BMVD1TUElLRV9BR1JFVE9QSUNJVFkgJT4lIHNlbGVjdChQZXB0aWRlLCBCQV9SYW5rLCBNVF9CQV9SYW5rLCBWYXJpYW50KSU+JSBwaXZvdF9sb25nZXIoY29scyA9IGMoQkFfUmFuayxNVF9CQV9SYW5rKSwgbmFtZXNfdG8gPSAiRGF0YXNldCIsdmFsdWVzX3RvID0gIkFmZiIpICU+JQogIG11dGF0ZShEYXRhc2V0ID0gcmVwbGFjZShEYXRhc2V0LCBEYXRhc2V0ID09ICJCQV9SYW5rIiwgIld1aGFuIikpJT4lbXV0YXRlKERhdGFzZXQgPSByZXBsYWNlKERhdGFzZXQsIERhdGFzZXQgPT0gIk1UX0JBX1JhbmsiLCAiT21pY3JvbiIpKSU+JQogIG11dGF0ZShEYXRhc2V0ID0gZmFjdG9yKERhdGFzZXQsIGxldmVscyA9IGMoIld1aGFuIiwiT21pY3JvbiIpKSklPiUKICAgICAgICAgZ2d2aW9saW4oeD0iRGF0YXNldCIseT0iQWZmIixjb2xvciA9ICJEYXRhc2V0IixhZGQ9ImJveHBsb3QiLHRyaW09VFJVRSkrZmFjZXRfZ3JpZCh+VmFyaWFudCkrdGhlbWVfcHVicihiYXNlX3NpemUgPSAxNikrc2NhbGVfeV9sb2cxMCgpK3N0YXRfY29tcGFyZV9tZWFucygpK3lsYWIoIkJpbmRpbmcgQWZmaW5pdHlcbihSYW5rKSIpClNVQlZBUl9WSU9MSU5fUExUCgpTVUJWQVJfVklPTElOX1BMVD1TUElLRV9BR1JFVE9QSUNJVFkgJT4lIHNlbGVjdChQZXB0aWRlLCBCQV9SYW5rLCBNVF9CQV9SYW5rLCBWYXJpYW50KSU+JSBwaXZvdF9sb25nZXIoY29scyA9IGMoQkFfUmFuayxNVF9CQV9SYW5rKSwgbmFtZXNfdG8gPSAiRGF0YXNldCIsdmFsdWVzX3RvID0gIkFmZiIpICU+JQogIG11dGF0ZShEYXRhc2V0ID0gcmVwbGFjZShEYXRhc2V0LCBEYXRhc2V0ID09ICJCQV9SYW5rIiwgIld1aGFuIikpJT4lbXV0YXRlKERhdGFzZXQgPSByZXBsYWNlKERhdGFzZXQsIERhdGFzZXQgPT0gIk1UX0JBX1JhbmsiLCAiT21pY3JvbiIpKSU+JQogIG11dGF0ZShEYXRhc2V0ID0gZmFjdG9yKERhdGFzZXQsIGxldmVscyA9IGMoIld1aGFuIiwiT21pY3JvbiIpKSklPiUKICAgICAgICAgZ2d2aW9saW4oeD0iRGF0YXNldCIseT0iQWZmIixjb2xvciA9ICJEYXRhc2V0IixhZGQ9ImJveHBsb3QiLHRyaW09VFJVRSkrZmFjZXRfZ3JpZCh+VmFyaWFudCkrdGhlbWVfcHVicihiYXNlX3NpemUgPSAxNikrc2NhbGVfeV9sb2cxMCgpK3N0YXRfY29tcGFyZV9tZWFucyhsYWJlbCA9ICJwLnNpZ25pZiIsbGFiZWwueC5ucGMgPSAiY2VudGVyIikreWxhYigiQmluZGluZyBBZmZpbml0eVxuKFJhbmspIikKU1VCVkFSX1ZJT0xJTl9QTFQKCnNhdmVSRFMoU1VCVkFSX1ZJT0xJTl9QTFQsICJTVUJWQVJfUkFOS19WSU9MSU5fUExULnJkcyIpCgoKYGBgCgoKCgpgYGB7cixkcGk9MzAwLCBmaWcud2lkdGggPSAxMH0KQUdSRVRPUElDSVRZX0RUPUFHUkVUT1BJQ0lUWV9EVCAlPiUgZmlsdGVyKCEgKEJpbmRlciA9PSAiTk9OQklOREVSIiAmIE1UX0JpbmRlciA9PSAiTk9OQklOREVSIikpJT4lIHVuZ3JvdXAKCkFHUkVUT1BJQ0lUWV9EVCAlPiUgc2VsZWN0KFBlcHRpZGUsIEJBX1JhbmssIE1UX0JBX1JhbmssIFZhcmlhbnQpJT4lIHBpdm90X2xvbmdlcihjb2xzID0gYyhCQV9SYW5rLE1UX0JBX1JhbmspLCBuYW1lc190byA9ICJEYXRhc2V0Iix2YWx1ZXNfdG8gPSAiQWZmIiklPiUKICBtdXRhdGUoRGF0YXNldCA9IGZhY3RvcihEYXRhc2V0LCBsZXZlbHMgPSBjKCJCQV9SYW5rIiwiTVRfQkFfUmFuayIpKSklPiUKICAgICAgICBnZ3Bsb3QoYWVzKHg9QWZmLCBjb2xvcj1EYXRhc2V0KSkrc3RhdF9lY2RmKHNpemU9MSkrZmFjZXRfZ3JpZCh+VmFyaWFudCkrdGhlbWVfcHVicihiYXNlX3NpemUgPSAxNikrZ3JpZHMoKSsgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAyKSkreWxhYigiQ3VtdWxhdGl2ZSBGcmVxLiBvZiBQZXB0aWRlcyIpK3hsYWIoIkJpbmRpbmcgQWZmaW5pdHlcbihSYW5rKSIpK2dlb21fdmxpbmUoeGludGVyY2VwdCA9IDIsbGluZXR5cGU9ImRhc2hlZCIsYWxwaGE9MC41KQoKU1VCVkFSX0VDREZfUExUPUFHUkVUT1BJQ0lUWV9EVCAlPiUgc2VsZWN0KFBlcHRpZGUsIEJBX1JhbmssIE1UX0JBX1JhbmssIFZhcmlhbnQpJT4lIHBpdm90X2xvbmdlcihjb2xzID0gYyhCQV9SYW5rLE1UX0JBX1JhbmspLCBuYW1lc190byA9ICJEYXRhc2V0Iix2YWx1ZXNfdG8gPSAiQWZmIiklPiUKICBtdXRhdGUoRGF0YXNldCA9IHJlcGxhY2UoRGF0YXNldCwgRGF0YXNldCA9PSAiQkFfUmFuayIsICJXdWhhbiIpKSU+JW11dGF0ZShEYXRhc2V0ID0gcmVwbGFjZShEYXRhc2V0LCBEYXRhc2V0ID09ICJNVF9CQV9SYW5rIiwgIk9taWNyb24iKSklPiUKICBtdXRhdGUoRGF0YXNldCA9IGZhY3RvcihEYXRhc2V0LCBsZXZlbHMgPSBjKCJXdWhhbiIsIk9taWNyb24iKSkpJT4lCiAgICAgICAgZ2dwbG90KGFlcyh4PUFmZiwgY29sb3I9RGF0YXNldCkpK3N0YXRfZWNkZihzaXplPTEpK2ZhY2V0X2dyaWQoflZhcmlhbnQpK3RoZW1lX3B1YnIoYmFzZV9zaXplID0gMTYpK2dyaWRzKCkrIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChucm93ID0gMikpK3lsYWIoIkN1bXVsYXRpdmUgRnJlcS4gb2YgUGVwdGlkZXMiKSt4bGFiKCJMb2cxMCBCaW5kaW5nIEFmZmluaXR5XG4oUmFuaykiKStnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyLGxpbmV0eXBlPSJkYXNoZWQiLGFscGhhPTAuNSkrc2NhbGVfeF9sb2cxMCgpClNVQlZBUl9FQ0RGX1BMVApzYXZlUkRTKFNVQlZBUl9FQ0RGX1BMVCwgIlNVQlZBUl9SQU5LX0FMTF9FQ0RGX1BMVC5yZHMiKQoKU1VCVkFSX1ZJT0xJTl9QTFQ9QUdSRVRPUElDSVRZX0RUICU+JSBzZWxlY3QoUGVwdGlkZSwgQkFfUmFuaywgTVRfQkFfUmFuaywgVmFyaWFudCklPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKEJBX1JhbmssTVRfQkFfUmFuayksIG5hbWVzX3RvID0gIkRhdGFzZXQiLHZhbHVlc190byA9ICJBZmYiKSAlPiUKICBtdXRhdGUoRGF0YXNldCA9IHJlcGxhY2UoRGF0YXNldCwgRGF0YXNldCA9PSAiQkFfUmFuayIsICJXdWhhbiIpKSU+JW11dGF0ZShEYXRhc2V0ID0gcmVwbGFjZShEYXRhc2V0LCBEYXRhc2V0ID09ICJNVF9CQV9SYW5rIiwgIk9taWNyb24iKSklPiUKICBtdXRhdGUoRGF0YXNldCA9IGZhY3RvcihEYXRhc2V0LCBsZXZlbHMgPSBjKCJXdWhhbiIsIk9taWNyb24iKSkpJT4lCiAgICAgICAgIGdndmlvbGluKHg9IkRhdGFzZXQiLHk9IkFmZiIsY29sb3IgPSAiRGF0YXNldCIsYWRkPSJib3hwbG90Iix0cmltPVRSVUUpK2ZhY2V0X2dyaWQoflZhcmlhbnQpK3RoZW1lX3B1YnIoYmFzZV9zaXplID0gMTYpK3NjYWxlX3lfbG9nMTAoKStzdGF0X2NvbXBhcmVfbWVhbnMoKSt5bGFiKCJCaW5kaW5nIEFmZmluaXR5XG4oUmFuaykiKQpTVUJWQVJfVklPTElOX1BMVAoKU1VCVkFSX1ZJT0xJTl9QTFQ9QUdSRVRPUElDSVRZX0RUICU+JSBzZWxlY3QoUGVwdGlkZSwgQkFfUmFuaywgTVRfQkFfUmFuaywgVmFyaWFudCklPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKEJBX1JhbmssTVRfQkFfUmFuayksIG5hbWVzX3RvID0gIkRhdGFzZXQiLHZhbHVlc190byA9ICJBZmYiKSAlPiUKICBtdXRhdGUoRGF0YXNldCA9IHJlcGxhY2UoRGF0YXNldCwgRGF0YXNldCA9PSAiQkFfUmFuayIsICJXdWhhbiIpKSU+JW11dGF0ZShEYXRhc2V0ID0gcmVwbGFjZShEYXRhc2V0LCBEYXRhc2V0ID09ICJNVF9CQV9SYW5rIiwgIk9taWNyb24iKSklPiUKICBtdXRhdGUoRGF0YXNldCA9IGZhY3RvcihEYXRhc2V0LCBsZXZlbHMgPSBjKCJXdWhhbiIsIk9taWNyb24iKSkpJT4lCiAgICAgICAgIGdndmlvbGluKHg9IkRhdGFzZXQiLHk9IkFmZiIsY29sb3IgPSAiRGF0YXNldCIsYWRkPSJib3hwbG90Iix0cmltPVRSVUUpK2ZhY2V0X2dyaWQoflZhcmlhbnQpK3RoZW1lX3B1YnIoYmFzZV9zaXplID0gMTYpK3NjYWxlX3lfbG9nMTAoKStzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwgPSAicC5zaWduaWYiLGxhYmVsLngubnBjID0gImNlbnRlciIpK3lsYWIoIkJpbmRpbmcgQWZmaW5pdHlcbihSYW5rKSIpClNVQlZBUl9WSU9MSU5fUExUCgpzYXZlUkRTKFNVQlZBUl9WSU9MSU5fUExULCAiU1VCVkFSX1JBTktfQUxMX1ZJT0xJTl9QTFQucmRzIikKCgpgYGAKCgoKCgoKCgoKCgoKCgoKCg==